home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / 3D QuickTime Dynamics / kSan Sources / kSanPlugInFile.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-24  |  3.8 KB  |  166 lines

  1.  
  2. #include "kSanPlugIn.h"
  3. #include "OHSharedUtils.h"
  4. #include "OHApplicationPublic.h"
  5. #include "OHAEDescUtils.h"
  6. #include "OHFileUtils.h"
  7.  
  8. OHList plugFileList;
  9.  
  10. short  loadPlugIn (kSanPlugFile *pf);
  11. short   looksLikeAPlugin(FSSpec *plug);
  12.  
  13. short kSanPlugFileAllocator(FSSpec *fs);
  14. short kSanPlugFileConstructor(kSanPlugFile *pf);
  15. void kSanPlugFileDestructor (kSanPlugFile *pf);
  16.  
  17. short initClassPlugFile (void)
  18. {
  19.     short err = noErr;
  20.     initializeList (&plugFileList);
  21.     return (err);
  22. }
  23.  
  24. short kSanPlugFileAllocator(FSSpec *fs)
  25. {
  26.     short err = noErr;
  27.     kSanPlugFile *pf;
  28.     
  29.     pf = nilPointer;
  30.     pf = (kSanPlugFile *)NewPtrClear (sizeof(kSanPlugFile));
  31.     if (pf == nilPointer) err = true;
  32.     else err = MemError();
  33.     if (!err) err =  kSanPlugFileConstructor (pf);
  34.     if (!err) 
  35.     {
  36.         pf->file.fs = *fs;
  37.         err = useResFile(&pf->file);
  38.         if ( !err )  
  39.         {
  40.             err = OHStringSetR(&pf->name, kBaseResID);
  41.             usePreviousResFile(&pf->file);
  42.             err = loadPlugIn(pf);
  43.                 
  44.             if (!err) 
  45.             {
  46.                 addToList (&plugFileList, (long) pf);
  47.             }
  48.         }
  49.     }
  50.     return (err);
  51. }
  52.  
  53. void kSanPlugFileDeallocator(kSanPlugFile *pf)
  54. {
  55.     kSanPlugFileDestructor ( pf);
  56.     DisposePtr ((Ptr) pf);
  57. }
  58.  
  59. short kSanPlugFileConstructor(kSanPlugFile *pf)
  60. {
  61.     short err = noErr;
  62.     
  63.     OHFileConstructor (&pf->file);
  64.     pf->loadUPP = nilPointer;
  65.     initializeList (&pf->residentClasses);
  66.     OHStringCreate(&pf->name); // get name
  67.     return(err);
  68. }
  69. void kSanPlugFileDestructor (kSanPlugFile *pf)
  70. {
  71.      if (pf->connID) CloseConnection(&pf->connID);
  72.     if (pf->loadUPP != nilPointer) DisposeRoutineDescriptor(pf->loadUPP);
  73.     OHFileDestructor (&pf->file);
  74.     OHStringDispose(&pf->name); 
  75.     disposeList (&pf->residentClasses);
  76.  
  77. }
  78. short  loadPlugIn (kSanPlugFile *pf)
  79. {
  80.     OSErr  err = noErr;
  81.     Ptr     mainAddr = nil;
  82.     Ptr            symAddr = nil;
  83.     Str255 errName;
  84.     Str255 libName;
  85.     CFragSymbolClass    symClass;
  86.  
  87.     OHStringGetP (&pf->name, libName);
  88.     err = GetSharedLibrary(libName, kPowerPCCFragArch, kPrivateCFragCopy,
  89.                            &pf->connID, &mainAddr, errName);
  90.  
  91.     if (!err)     err = FindSymbol(pf->connID, "\pkSanPlugInInit", &symAddr, &symClass);
  92.     if (!err) 
  93.     {
  94.         pf->doAboutPlugIn = nilPointer;
  95.         pf->loadUPP = nilPointer;
  96.         pf->loadUPP = NewRoutineDescriptor((ProcPtr)symAddr, kShortOneStackPtrProc, GetCurrentISA());
  97.         if (pf->loadUPP)  err = CallUniversalProc(pf->loadUPP, kShortOneStackPtrProc, pf);
  98.     }
  99.     return err;
  100. }
  101. short   looksLikeAPlugin(FSSpec *plugSpec)
  102. {
  103.     OSType     kSanType ; // could be kSan or kTwo
  104.     OSType     shlbType = 'shlb';
  105.     short result = false;
  106.     short err;
  107.     FInfo fndrInfo;    
  108.         
  109.     kSanType = OHOCID(globalAppObject);
  110.     err = FSpGetFInfo(plugSpec, &fndrInfo);
  111.     if (!err)
  112.     {    
  113.         if ((fndrInfo.fdType == shlbType) && (fndrInfo.fdCreator == kSanType))
  114.         {
  115.             result = true;
  116.         }
  117.     }
  118.     return (result);
  119. }
  120.  
  121. short   searchFilesForPlugInsCallback(AEDesc *nthDesc, void *dummy);
  122. short   searchFilesForPlugInsCallback(AEDesc *nthDesc, void *dummy)
  123. {
  124. #pragma unused(dummy)
  125.     short err = noErr;
  126.     FSSpec     plugInSpec;
  127.     if ( nthDesc->descriptorType == typeFSS)
  128.     {
  129.         plugInSpec = (*(FSSpec *)(*nthDesc->dataHandle));
  130.         if (looksLikeAPlugin (&plugInSpec)) kSanPlugFileAllocator(&plugInSpec);
  131.     }
  132.     return (err);
  133. }
  134.  
  135. void   disposeFoundPlugIns(void)
  136. {
  137.     kSanPlugFile *pf;
  138.     while (OHListCount( &plugFileList) >0)
  139.     {
  140.         pf = (kSanPlugFile *)  popTopItem (&plugFileList);
  141.         kSanPlugFileDeallocator(pf);
  142.     }
  143.     disposeList (&plugFileList);
  144. }
  145.  
  146. short   searchFilesForPlugIns(void)
  147. {
  148.     short err = noErr;
  149.     FSSpec     plugInFolderSpec;
  150.     FSSpec     plugInSpec;
  151.     AEDesc fsList = {typeNull, nilPointer};
  152.     
  153.     getAppSpec(&plugInFolderSpec);    
  154.     CTo255 ("plugins" , plugInFolderSpec.name );
  155.     err = getListOfFilesInFolder(&plugInFolderSpec, &fsList);
  156.     if (fsList.descriptorType == typeFSS)
  157.     {
  158.         plugInSpec = (*(FSSpec *)(*fsList.dataHandle));
  159.         if (looksLikeAPlugin (&plugInSpec)) kSanPlugFileAllocator(&plugInSpec);
  160.     }
  161.     else if (fsList.descriptorType == typeAEList)
  162.     {        
  163.         err = AEListEveryItemDoOneArg(&fsList, typeFSS, searchFilesForPlugInsCallback, 0L);
  164.     }
  165.     return (err);
  166. }